package com.rd.controller;


import cn.hutool.core.util.RandomUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qcloud.cos.utils.Md5Utils;
import com.rd.pojo.Admin;
import com.rd.service.IAdminService;
import com.rd.util.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author jianan
 * @since 2024-06-04
 */
@RestController
@RequestMapping("/admin")
public class AdminController {
    @Autowired
    private IAdminService adminService;
    //1.方法访问控制修饰符必须是public
    //2.方法名(见名知义)
    //3.返回值类型都是R 老师封装统一的结果
    //4.参数 看页面传什么，方法就接收什么
    // http://localhost:80/admin/login?username=admin&password=123456
    @GetMapping("/login")
    public R login(String username, String password) {
        System.out.println("username: " + username+",password="+password);
        R result = adminService.login(username, password);
        return result;
    }


    @PostMapping("/add")
    public R add(@RequestBody Admin admin) { //页面传递的是json格式对象
        System.out.println("检查参数：" + admin);
        //1.判断用户名是否已经被使用
        QueryWrapper<Admin> qw=new QueryWrapper<>(); //设置查询条件
        qw.eq("username",admin.getUsername()); //where username=?
        int n = adminService.count(qw); //这个方法是Mybatis-plus框架中IService接口中提供的方法
        if(n>0){
            return  R.fail().setMsg("注册失败,此用户名已被使用!"); //说明数据库中已经存在此用户名
        }
        //2.将admin对象存入到数据库中
        String salt = RandomUtil.randomString(6); //随机生成的6位字符串
        admin.setAddtime(LocalDateTime.now());
        admin.setStatus(0);
        admin.setSalt(salt);
        //对密码加密
        String password= admin.getPassword(); //页面传递的密码 123456
        String md5pwd = Md5Utils.md5Hex(password + salt);//加密后的密码
        admin.setPassword(md5pwd); //将加密后的密码设置给对象
        boolean flag = adminService.save(admin);
        return flag ? R.ok().setMsg("管理员添加成功!") : R.fail().setMsg("管理员添加失败!");
    }
    @GetMapping("/list")
    public R list(@RequestParam("page") int page,
                  @RequestParam("limit") int limit) {
        System.out.println("页码:" +page+",每页显示记录个数:" + limit);
        //创建一个分页插件工具对象，并传入页码和每页显示记录个数
        Page<Admin> tool =new Page<Admin>(page,limit);
        //调用mybatis-plus提供的IService接口中提供page方法
        Page<Admin> adminPage = adminService.page(tool);
        //此时已经分页查询成功，只需要从adminPage中获取信息
        long total = adminPage.getTotal(); //获取总条数
        List<Admin> list = adminPage.getRecords();//获取页面是显示的数据
        //将list集合和count的值传递给前端table组件页面上显示
        return  R.ok().setData(list).setCount(total);
    }
@PostMapping("/modifyStatus")
    public R modifyStatus(@RequestBody Admin admin) {
        System.out.println("更新管理员状态功能："+admin);
        boolean flag = adminService.updateById(admin);
        return flag?R.ok().setMsg("状态更新成功！"):
        R.fail().setMsg("状态更新失败！");
}
@GetMapping("/del")
    public R del(@RequestParam("id") int id) {
        boolean flag = adminService.removeById(id);
        return flag ? R.ok().setMsg("管理员删除成功！"):
        R.fail().setMsg("管理员删除失败");
}
    @GetMapping("/updatePassword")
    public R updatePassword(@RequestParam("id") int id,
                            @RequestParam("old_password") String old_password,
                            @RequestParam("new_password") String new_password) {
        System.out.println("管理员编号:"+id+",旧密码:"+old_password+",新密码：" + new_password);

        //1.判断旧密码是否正确
        Admin admin = adminService.getById(id);
        //2.对参数old_password进行加密
        String old_md5_pwd = Md5Utils.md5Hex(old_password + admin.getSalt());
        if(!old_md5_pwd.equals(admin.getPassword())) {
            return  R.fail().setMsg("密码更新失败，旧密码错误!");
        }
        //3.到了这一步，说明旧密码正确，我们需要更新操作
        // update t_admin password=新密码  where id=管理员编号
        String new_md5_pwd = Md5Utils.md5Hex(new_password + admin.getSalt());
        admin.setPassword(new_md5_pwd);//修改密码
        boolean flag = adminService.updateById(admin);
        return  flag?R.ok().setMsg("密码修改成功，请重新登录!"):R.fail().setMsg("密码更新失败!");
    }

}
